package csu.web.mypetstore.service;

import csu.web.mypetstore.domain.CartItem;
import csu.web.mypetstore.domain.Item;
import csu.web.mypetstore.persistence.CartDao;
import csu.web.mypetstore.persistence.ItemDao;
import csu.web.mypetstore.persistence.impl.CartDaoImpl;
import csu.web.mypetstore.persistence.impl.ItemDaoImpl;

import java.math.BigDecimal;
import java.util.*;

public class CartService {
    private CartDao cartDao;
    private ItemDao itemDao;
    public CartService(){
        this.cartDao = new CartDaoImpl();
        this.itemDao = new ItemDaoImpl();
    }

    public boolean isInCart(String username,String itemId){
        return cartDao.isInCart(username,itemId);
    }

    public Iterator<CartItem> getCartItems(String username) {
        return getCartItemList(username).iterator();
    }

    public List<CartItem> getCartItemList(String username) {
        List<CartItem> cartItemList = cartDao.getItemsListByUsername(username);

        for (CartItem cartItem:cartItemList){
            Item item = itemDao.getItem(cartItem.getItemId());
            cartItem.setItem(item);
        }

        return cartItemList;
    }

    public int getNumberOfItems(String username) {
        return getCartItemList(username).size();
    }

    public Iterator<CartItem> getAllCartItems(String username) {
        return getCartItemList(username).iterator();
    }

    public void addItem(String username,Item item) {
        //CartItem cartItem = cartDao.getCartItem(username,item.getItemId());
        if (!isInCart(username,item.getItemId())) {
            CartItem cartItem = new CartItem();
            cartItem.setItem(item);
            cartItem.setQuantity(1);
            cartItem.setItemId(item.getItemId());
            cartItem.setUsername(username);
            cartDao.addItem(cartItem);
        }else{
            incrementQuantity(username,item.getItemId());
        }

    }

    public String removeItemById(String username,String itemId) {
        boolean flag = cartDao.isInCart(username,itemId);
        if (!flag) {
            return null;
        } else {
            CartItem cartItem = cartDao.getCartItem(username,itemId);
            String item = cartItem.getItemId();
            cartDao.removeItem(username,itemId);
            return itemId;
        }
    }

    public void incrementQuantity(String username,String itemId) {
        cartDao.incrementQuantity(username,itemId);
    }

    public void setQuantity(String username,String itemId, int quantity) {
        cartDao.setQuantity(username,itemId,quantity);
    }

    public BigDecimal getSubTotal(String username) {
        BigDecimal subTotal = new BigDecimal("0");

        BigDecimal listPrice;
        BigDecimal quantity;
        for(Iterator<CartItem> items = this.getCartItems(username); items.hasNext(); subTotal = subTotal.add(listPrice.multiply(quantity))) {
            CartItem cartItem = (CartItem)items.next();
            Item item = cartItem.getItem();
            listPrice = item.getListPrice();
            quantity = new BigDecimal(String.valueOf(cartItem.getQuantity()));
        }

        return subTotal;
    }

    public void clearCart(){
        cartDao.clearCart();
    }
}
